home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / demo / mag / hLA-AP15.lha / hLA-AP15 / bonus / zdroj.lha / quicks.s < prev    next >
Text File  |  2000-06-15  |  3KB  |  154 lines

  1.  
  2.     incdir    "include:"
  3.     include    "system.gs"
  4.     
  5.     bsr    Start        ;oteverni okna a alokace vseho
  6.     bsr    Generuj
  7.     bsr    vypis
  8.     
  9.     move.w    #200,-(sp)    ;pravy kraj celeho (jedeme po dvou)
  10.     move.w    #2,-(sp)        ;levy kraj
  11.     bsr    utrid
  12.     bsr    vypis
  13.  
  14. konec3    move.l    vystup,d1
  15.     CALLDOS    Close
  16. konec2    move.l    _DOSBase,a1
  17.     CALLEXEC    CloseLibrary
  18. konec1    rts
  19.  
  20. *** Podprogramy ***
  21.  
  22. utrid    moveq    #0,d7
  23.     moveq    #0,d6
  24.     move.w    4(sp),d6        ;v d6 levy okraj
  25.     move.w    d6,d3
  26.     move.w    6(sp),d7        ;v d7 pravy
  27.     move.w    d7,d4
  28.     move.l    (sp),4(sp)
  29.     add.l    #4,sp
  30.     cmp.w    d6,d7
  31.     bls    ut5
  32.     
  33.     move.l    #pole-2,a0
  34.     move.w    (a0,d6),d5    ;v d5 pivot - nejlehci je vybrat hned krajniho
  35.     
  36. ut2    cmp.w    (a0,d6),d5
  37.     bls    ut1        ;jedem dokud nenarazime na prvek
  38.     addq    #2,d6        ;vetsi nez pivot
  39.     bra    ut2
  40. ut1
  41.     cmp.w    (a0,d7),d5
  42.     bcc    ut3        ;jedem dokud nenarazime na prvek
  43.     subq    #2,d7        ;mensi nebo rovny pivotovi
  44.     bra    ut1
  45. ut3    
  46.     cmp    d6,d7
  47.     bcs    ut4        ;nemenit jestli  d6>d7
  48.     move.w    (a0,d7),d0
  49.     move.w    (a0,d6),(a0,d7)
  50.     move.w    d0,(a0,d6)
  51.     addq    #2,d6        ;a posunout indexy
  52.     subq    #2,d7        ;kvuli ukonceni cyklu
  53.     cmp.w    d6,d7
  54.     bcc    ut2        ;a znova od zacatku
  55. ut4
  56.     move.w    d4,-(sp)
  57.     move.w    d6,-(sp)
  58.     move.w    d7,-(sp)
  59.     move.w    d3,-(sp)
  60.     bsr    utrid
  61.     bsr    utrid
  62. ut5
  63.     rts
  64.  
  65. vypis    move.l    #pole,a5
  66.     moveq    #100-1,d6
  67.     
  68. vyplab2    moveq    #4-1,d7
  69.     moveq    #0,d0
  70.     move.w    (a5)+,d0        ;v d0 je cislo
  71.     move.l    #cislo,a1        ;adresa vypisovaneho bufferu
  72.     swap    d0
  73.     
  74. vyplab1    rol.l    #4,d0
  75.     add.w    #48,d0
  76.     cmp.w    #58,d0
  77.     bcs    noch
  78.     add.w    #7,d0
  79. noch    move.b    d0,(a1)+
  80.     clr.w    d0
  81.     dbf    d7,vyplab1
  82.     
  83.     move.l    vystup,d1
  84.     move.l    #cislo,d2
  85.     moveq    #5,d3
  86.     CALLDOS    Write
  87.     dbf    d6,vyplab2
  88.     
  89.     move.l    vystup,d1
  90.     move.l    #odrad,d2
  91.     move.l    #2,d3
  92.     CALLDOS    Write
  93.     rts
  94.  
  95. Generuj    ;procedura vygeneruje nahodna cisla - 100 wordu
  96.     moveq    #100-1,d7
  97.     move.l    #pole,a0
  98.     move.l    #$FFFF,d0
  99. genlab    bsr    Rnd
  100.     move.w    d1,(a0)+
  101.     dbf    d7,genlab
  102.     rts
  103.  
  104.     ; D0 - Range (0 - x)
  105.     ; D1 - Returns Number (Long Word, But Only Grab Word!)
  106.     
  107. Rnd    Move.w    .seed(pc),d1    ;rnd by Ballfrog
  108.     Mulu    #9377,d1
  109.     Add.w    #1,d1    ;9439
  110.     Move.w    d1,.seed        ; Store Value For Seed Next Time
  111.     And.l    #$7FFF,d1        ; Make Sure Positive Word
  112.  
  113.     Divu    d0,d1
  114.     Swap    d1            ; Make Remainder Low Word
  115.     Rts
  116.     
  117. .seed    dc.w    1
  118.  
  119.  
  120.     
  121. Start    move.l    (sp)+,a5        ;vybereme navratovou adresu
  122.  
  123.     moveq    #39,d0
  124.     move.l    #dosname,a1
  125.     CALLEXEC    OpenLibrary
  126.     tst.l    d0
  127.     beq    konec1
  128.     move.l    d0,_DOSBase
  129.     
  130.     move.l    #newvystup,d1
  131.     move.l    #MODE_NEWFILE,d2
  132.     CALLDOS    Open
  133.     tst.l    d0
  134.     beq    konec2
  135.     move.l    d0,vystup
  136.  
  137.     jmp    (a5)    ;vse v poradku - vyskocime
  138.     
  139.     
  140. ***Data***
  141.  
  142. dosname    dc.b    'dos.library',0
  143. newvystup    dc.b    'con:0/0/624/250/Quicksort/close/wait',0
  144.  
  145. _DOSBase    ds.l    1
  146. vystup    ds.l    1
  147.  
  148. cislo    dc.b    0,0,0,0,32,0
  149.     cnop    0,2
  150.     
  151. odrad    dc.b    10,10
  152.  
  153. pole    dcb.w    100,00
  154.